home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 23
/
AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso
/
Updates
/
Hardware
/
pcmser
/
source
/
pcmser.device.s
< prev
next >
Wrap
Text File
|
1999-11-25
|
30KB
|
1,305 lines
include "exec/types.i"
include exec/exec.i
include devices/serial.i
include resources/card.i
include macros.i
include uart.i
include cistpl.i
include pcmser.i
xlib OpenLibrary
xlib CloseLibrary
xlib FindTask
xlib FreeMem
xlib ReplyMsg
xlib AddTail
xlib Disable
xlib Remove
xlib OpenResource
xlib Enable
xlib RemHead
xlib Delay
xlib OwnCard
xlib GetCardMap
xlib CopyTuple
xlib ReleaseCard
xlib CardMiscControl
;--Constants
REVISION=7
VERSION=0
MYPRI=0
UNITS=1
section main,code
;------------------------------------------------------------------------
j moveq #-1,d0 ;Stupid user tried to start us!
rts
initddescript dc.w RTC_MATCHWORD ;RT_MATCHWORD
dc.l initddescript ;RT_MATCHTAG
dc.l endofcode ;RT_ENDSKIP
dc.b RTF_AUTOINIT ;RT_FLAGS
dc.b VERSION ;RT_VERSION
dc.b NT_DEVICE ;RT_TYPE
dc.b MYPRI ;RT_PRI
dc.l myname
dc.l idstring
dc.l init
myname dc.b "pcmser.device",0
idstring dc.b "pcmser.device 0.7 (26.11.99)",13,10,0
cnop 0,4
init dc.l MYDEV_SIZEOF
dc.l functable
dc.l datatable
dc.l initroutine
;--Function table
functable dc.l opendevice ;open -6
dc.l closedevice ;close -12
dc.l expunge ;expunge -18
dc.l resvec ;reserved -24
dc.l beginio ;BeginIO -30
dc.l abortio ;AbortIO -36
dc.l -1 ;marks end of list
;---Data table
datatable dc.l 0
dc.l 0
dc.b NT_DEVICE
dc.b 0
dc.l myname
dc.b LIBF_SUMUSED!LIBF_CHANGED ;UBYTE LIB_FLAGS
dc.b 0 ;UBYTE LIB_pad
dc.w 0 ;UWORD LIB_NEGSIZE
dc.w 0 ;UWORD LIB_POSSIZE
dc.w VERSION ;UWORD LIB_VERSION
dc.w REVISION ;UWORD LIB_REVISION
dc.l idstring ;APTR LIB_IDSTRING
dc.l 0 ;ULONG LIB_SUM
dc.w 0 ;UWORD LIB_OPENCNT
_SysBase dc.l 0
devicebase dc.l 0
;========================================================================
;---initroutine---
;d0=devicebase
;a0=seglist
;
;return d0
;devicebase=ok
;0=error
;========================================================================
initroutine movem.l d1-a6,-(sp)
move.l d0,a5
move.w #VERSION,LIB_VERSION(a5)
move.w #REVISION,LIB_REVISION(a5)
move.l d0,devicebase
move.l a0,MD_SEGLIST(a5)
move.l 4.w,_SysBase
bsr.w setupdevice
tst.l d0
beq.b .ok
moveq #0,d0
bra.b .end
.ok move.l a5,d0
.end movem.l (sp)+,d1-a6
rts
;========================================================================
;---opendevice--- guaranteed to be single threaded
;d0=unit
;d1=flags
;a1=io-request
;a6=devicebase
;
;return IO_ERROR
;0=ok
;!0=errorcode
;========================================================================
opendevice move.l a6,-(sp)
cmp.l #UNITS,d0
bge.w .error
clr.b IO_ERROR(a1)
mulu #PCMNODE_SIZEOF,d0
add.l #serdata,d0
move.l d0,IO_UNIT(a1)
move.l d0,a0 ;a0=serunit
tst.w PCM_UNITOPENCNT(a0) ;fix the shared access stuff
bne.b .not1st
movem.l a0-a1,-(sp) ;this is the 1st time the
sub.l a1,a1 ;device opened
GET SysBase
CALL FindTask ;get the owner of the device
movem.l (sp)+,a0-a1
move.l d0,PCM_OWNERTASK(a0)
bclr #STATUSB_SHARED,PCM_FLAGS(a0)
btst #SERB_SHARED,IO_SERFLAGS(a1) ;use shared access?
beq.b .sharedcont ;no!
bset #STATUSB_SHARED,PCM_FLAGS(a0) ;yes!
bra.b .sharedcont
.not1st GET SysBase
movem.l a0/a1,-(sp)
sub.l a1,a1
CALL FindTask
movem.l (sp)+,a0/a1
cmp.l PCM_OWNERTASK(a0),d0
beq.b .no7wire ;no need to check CTS/RTS again
btst #STATUSB_SHARED,PCM_FLAGS(a0)
beq.b .sharederr
btst #SERB_SHARED,IO_SERFLAGS(a1) ;shared?
bne.b .no7wire
.sharederr move.b #SerErr_DevBusy,IO_ERROR(a1)
bra.w .end
.sharedcont btst #SERB_7WIRE,IO_SERFLAGS(a1) ;CTS/RTS?
beq.b .no7wire
bset #STATUSB_USE7WIRE,PCM_FLAGS(a0)
move.l PCM_BASEADR(a0),a6
move.b UART_MSR(a6),d0
btst #4,d0
beq.b .no7wire
bset #STATUSB_CTS,PCM_FLAGS(a0)
.no7wire move.l devicebase(pc),a6
addq.w #1,LIB_OPENCNT(a6)
addq.w #1,PCM_UNITOPENCNT(a0)
bclr #LIBB_DELEXP,MD_FLAGS(a6)
move.l #9600,IO_BAUD(a1) ;fill in & set defult settings
move.b #8,IO_READLEN(a1)
move.b #8,IO_WRITELEN(a1)
move.b #1,IO_STOPBITS(a1)
move.l a0,-(sp)
bsr.w setparams
move.l (sp)+,a0
move.l PCM_BASEADR(a0),a1
move.b #0,UART_FCR(a1) ;FIFOs off
btst #STATUSB_USEFIFO,PCM_FLAGS(a0)
beq.b .nofifo
move.b #7,UART_FCR(a1) ;FIFOs on (yeah!!)
.nofifo move.b UART_MSR(a1),d0 ;clear MSR
move.b UART_RBR(a1),d0
move.b UART_LSR(a1),d0
move.b UART_IIR(a1),d0
move.b #%1011,UART_MCR(a1) ;DTR/RTS/master int on
move.b #%1111,UART_IER(a1) ;enable all ints
cmp.w #1,PCM_UNITOPENCNT(a0)
bne.b .notfirstopen
;If this is the first time this unit is opened we need
;to wait a little while to allow the modem to init itself
;otherwise DSR won't come on and some programs will complain.
lea dosname(pc),a1
moveq #37,d0
GET SysBase
CALL OpenLibrary
movea.l d0,a6
tst.l d0
beq.b .notfirstopen
move.l #30,d1
CALL Delay
move.l a6,a1
GET SysBase
CALL CloseLibrary
.notfirstopen move.l devicebase(pc),a0
bra.b .end
.error move.b #IOERR_OPENFAIL,IO_ERROR(a1)
.end move.l (sp)+,a6
rts
dosname dc.b "dos.library",0
;========================================================================
;---closedevice--- guaranteed to be single threaded
;a6=devicebase
;a1=io-request
;
;return d0
;0=do nothing
;seglist=unload device
;========================================================================
closedevice move.l IO_UNIT(a1),a0
move.l #-1,IO_UNIT(a1)
move.l #-1,IO_DEVICE(a1)
clr.l d0
subq.w #1,LIB_OPENCNT(a6)
subq.w #1,PCM_UNITOPENCNT(a0) ;last opener closed us?
bne.b .end
move.l PCM_BASEADR(a0),a0 ;in that case turn
move.b #0,UART_MCR(a0) ;master int off
move.b #0,UART_IER(a0) ;ints off
btst #LIBB_DELEXP,MD_FLAGS(a6) ;delayed expunge?
bne.b .doexp
btst #DEVINFOB_CONFIGURED,MD_MYFLAGS(a6) ;user removed card?
bne.b .end
.doexp bsr.b expunge ;then expunge
.end rts
;========================================================================
;---expunge--- guaranteed to be single threaded
;a6=devicebase
;
;return d0
;0=do nothing
;seglist=unload device
;========================================================================
expunge movem.l d2/a5-a6,-(sp)
tst.w LIB_OPENCNT(a6)
beq.b .remove
bset #LIBB_DELEXP,MD_FLAGS(a6) ;opencnt was not 0
clr.l d0 ;do delayed expunge
bra.b .end
.remove move.l a6,a5
bsr.w cleanupdevice
move.l MD_SEGLIST(a5),d2
move.l a5,a1
REMOVE
move.l a5,a1
moveq #0,d0
move.w LIB_NEGSIZE(a5),d0
suba.l d0,a1
add.w LIB_POSSIZE(a5),d0
GET SysBase
CALL FreeMem
move.l d2,d0
; COLTESTR ;!!!!!!!!!!!!!!!
.end movem.l (sp)+,d2/a5-a6
rts
;========================================================================
;---beginio---
;a6=devicebase
;a1=iorequest
;========================================================================
beginio movem.l a6,-(sp)
clr.b IO_ERROR(a1)
move.b #NT_MESSAGE,LN_TYPE(a1)
.noread btst #DEVINFOB_CONFIGURED,MD_MYFLAGS(a6)
beq.b .nocard ;card is not configured (removed)
clr.l d0
move.w IO_COMMAND(a1),d0
cmp.l #SER_DEVFINISH+1,d0 ;Is IO_COMMAND too high?
bge.b .unknowncmd
add.w d0,d0
lea .cmdtable(pc),a0
add.w d0,d0
move.l (a0,d0.w),a0
cmp.l #0,a0 ;Unsupported command?
beq.b .unknowncmd
jsr (a0) ;Jump to CMD-code
bra.b .cont
.unknowncmd move.b #IOERR_NOCMD,IO_ERROR(a1)
clr.b IO_FLAGS(a1)
GET SysBase
CALL ReplyMsg
bra.b .cont
.nocard cmp.w #CMD_READ,IO_COMMAND(a1)
beq.b .nocardreadreq
move.b #IOERR_SELFTEST,IO_ERROR(a1)
clr.b IO_FLAGS(a1)
GET SysBase
CALL ReplyMsg
.cont movem.l (sp)+,a6
rts
;Since the user have removed the card we have to queue read-requests
;to that the program calling us won't hang in a loop trying to post an
;io-request to us all the time resulting in that it will hang.
.nocardreadreq move.l IO_UNIT(a1),a0
lea PCM_READLIST(a0),a0
GET SysBase
CALL AddTail
bra.b .cont
cnop 0,4
.cmdtable dc.l 0 ;0 CMD_INVALID
dc.l cmd_reset ;1 CMD_RESET
dc.l cmd_read ;2 CMD_READ
dc.l cmd_write ;3 CMD_WRITE
dc.l 0 ;4 CMD_UPDATE
dc.l cmd_clear ;5 CMD_CLEAR
dc.l 0 ;6 *CMD_STOP
dc.l 0 ;7 *CMD_START
dc.l cmd_flush ;8 CMD_FLUSH
dc.l